package basics

import "fmt"

// SwitchControl 选择结构 switch
func SwitchControl() {

	// case后面不用编写break，不会出现case穿透问题
	switch num := 3; num {
	case 1:
		fmt.Println("星期一")
	case 2:
		fmt.Println("星期二")
	case 3:
		fmt.Println("星期三")
	case 4:
		fmt.Println("星期四")
	case 5:
		fmt.Println("星期五")
	case 6:
		fmt.Println("星期六")
	case 7:
		fmt.Println("星期日")
	default:
		fmt.Println("Other...")
	}

	// case 后面可以有多个表达式
	// 如果想让case穿透，必须在case语句块最后添加fallthrough关键字
	switch num := 3; num {
	case 1, 2, 3, 4, 5:
		fmt.Println("工作日")
	case 6:
		fallthrough
	case 7:
		fmt.Println("非工作日")
	default:
		fmt.Println("Other...")
	}

	// case后面不仅仅可以放常量,还可以放变量、函数和表达式
	value := 2
	switch num := 1; num {
	case value: // 变量
		fmt.Println("num等于value")
	default:
		fmt.Println("num不等于value")
	}

	switch num := 1; num {
	case getValue(): // 函数
		fmt.Println("num等于value")
	default:
		fmt.Println("num不等于value")
	}

	switch num := 18; {
	case num >= 0 && num <= 10: // 表达式
		fmt.Println("num是一个0~10之间的数")
	case num > 10 && num <= 20:
		fmt.Println("num是一个11~20之间的数")
	default:
		fmt.Println("num是一个大于20的数")
	}

	// 利用break跳转到指定标签
outer:
	switch num := 2; num {
	case 1:
		fmt.Println(1)
	case 2:
		fmt.Println(2)
		break outer
	default:
		fmt.Println("other")
	}
	fmt.Println("come here")
}

// getValue 获取数值 1
func getValue() int {
	return 1
}
